#ifndef CHATCLIENT_H
#define CHATCLIENT_H

#include <QWidget>
#include <QPushButton>
#include <QIcon>
#include <QHBoxLayout>
#include <QLineEdit>
#include "model/data.h"
#include "sessionfriendarea.h"
#include "messageshowarea.h"
#include "messageeditarea.h"
#include "selfinfowidget.h"
#include "sessiondetailwidget.h"
#include "groupsessiondetailwidget.h"
#include "addfrienddialog.h"
#include "model/datacenter.h"

QT_BEGIN_NAMESPACE
namespace Ui {
class ChatClient;
}
QT_END_NAMESPACE

class ChatClient : public QWidget
{
    Q_OBJECT

public:
    static ChatClient* getInstance();
    ~ChatClient();

private:
    static ChatClient* instance;
    //对于单例模式来说，最关键的部分，不是 “创建实例”，而是限制别人创建实例
    ChatClient(QWidget *parent = nullptr);
    Ui::ChatClient *ui;

    //窗口最左侧部分
    QWidget* windowLeft;
    //窗口中间部分
    QWidget* windowMid;
    //窗口右侧部分
    QWidget* windowRight;

    //用户头像
    QPushButton* userAvatar;
    //会话标签页按钮
    QPushButton* sessionTabBtn;
    //好友标签页按钮
    QPushButton* friendTabBtn;
    //好友申请标签页按钮
    QPushButton* applyTabBtn;

    //用户搜索框
    QLineEdit* searchEdit;
    //添加好友按钮
    QPushButton* addFriendBtn;

    //显示会话详情按钮
    QPushButton* extraBtn;

    SessionFriendArea* sessionFriendArea;

    // 显示会话标题
    QLabel* sessionTitleLabel;

    //消息展示区
    MessageShowArea* messageShowArea;
    //消息编辑区
    MessageEditArea* messageEditArea;

    enum ActiveTab{
        SESSION_LIST,
        FRIEND_LIST,
        APPLY_LIST
    };

    enum ActiveTab activeTab = SESSION_LIST;

public:
    // 初始化主窗口的样式布局
    void initMainWindow();
    //初始化左侧窗口布局
    void initLeftWindow();
    //初始化中间窗口布局
    void initMidWindow();
    //初始化右侧窗口布局
    void initRightWindow();
    //初始化信号槽
    void initSignalSlot();
    //初始化websocket
    void initWebsocket();

    //切换到会话列表的槽函数
    void switchTabToSession();
    //切换到好友列表的槽函数
    void switchTabToFriend();
    //切换到好友申请列表的槽函数
    void switchTabToApply();

    //加载会话列表的函数
    void loadSessionList();
    // 加载好友列表
    void loadFriendList();
    // 加载好友申请列表
    void loadApplyList();

    void updateFriendList();
    void updateChatSessionList();
    void updateApplyList();

    void loadRecentMessage(const QString& chatSessionId);
    void updateRecentMessage(const QString& chatSessionId);

    // 点击好友项之后, 切换到会话列表的总函数, 上方的 switchTabToSession 只是其中的一个环节
    void switchSession(const QString& userId);

    MessageShowArea* getMessageShowArea();
};
#endif // CHATCLIENT_H
